Universo Online
Web Sites Pessoais
Anterior Próximo Índice

Passando Estruturas para Rotinas Assembly

Uma estrura nada mais é do que um conjunto de dados de diversos tamanhos que pode ser referida pelo seu endereço inicial mais um deslocamento para cada um dos dados dentro da estrutura em relação a esse endereço. Desse modo, em uma estrutura do tipo

         struct MinhaStrutura
         {
            int ano;
            unsigned char  mes;
            unsigned char dia;
         };
o dado ano começa no deslocamento zero em relação ao endereço inicial, o dado mes começa no deslocamento 2 e o dado dia começa no deslocamento 3:

deslocamento

0000         ano   -    2 bytes

0002         mes   -    1 byte

0003         dia     -   1 byte

Dentro do programa assembly, se nós queremos alterar uma estrutura, assim como qualquer outra variável, devemos em primeiro lugar obter o seu endereço. O parâmetro formal (aquele que foi declarado no protótipo do programa C), deve então ser defininido como um ponteiro, e o parâmetro efetivo (aquele que é passado para a rotina) é, na verdade, o endereço da variável ou estrutura (usando o operando de endereço "&"). Usa-se geralmente o registrador SI para receber o deslocamento inicial da estrutura, e nesse caso, o segmento "default" de dados será DS. No exemplo a seguir é passado o endereço de uma estrutura, e a rotina assembly inicializa a estrutura com determinados valores:
			
segment _TEXT class=CODE
     GLOBAL _IniciaStruct


_IniciaStruct
       push bp
       mov  bp,sp
       push si

       mov  si,[bp+4]          ;si     = endereço da estrutura
       mov  word [si+0],2001   ;ano - si     = primeiro campo: word
       mov  byte [si+2],10     ;mês - si + 2 = segundo campo: byte
       mov  byte [si+3],22     ;dia - si + 3 = terceiro campo: byte

       pop si
       pop bp
       ret

E esta é o programa em Linguagem C que chama a rotina IniciaStruct( ):


#include struct teste { int ano; unsigned char mes; unsigned char dia; }; extern void IniciaStruct(struct teste *); int main() { struct teste MinhaStr; IniciaStruct(&MinhaStr); printf("\ndia = %d ",MinhaStr.dia); printf("\nmes = %d ",MinhaStr.mes); printf("\nano = %d ",MinhaStr.ano); return(0); }
Anterior Próximo Índice